package com.captain.leetcode.动态规划;

/**
 * @author captain
 * @Des 数组的每个下标作为⼀个阶梯，第 i 个阶梯对应着⼀个⾮负数的体⼒花费值 cost[i]（下标从 0 开始）。
 * 每当你爬上⼀个阶梯你都要花费对应的体⼒值，⼀旦⽀付了相应的体⼒值，你就可以选择向上爬⼀个阶
 * 梯或者爬两个阶梯。
 * 请你找出达到楼层顶部的最低花费。在开始时，你可以选择从下标为 0 或 1 的元素作为初始阶梯。
 * 示例 1：
 * 输⼊：cost = [10, 15, 20]
 * 输出：15
 * 解释：最低花费是从 cost[1] 开始，然后⾛两步即可到阶梯顶，⼀共花费 15 。
 * 示例 2：
 * 输⼊：cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
 * 输出：6
 * 解释：最低花费⽅式是从 cost[0] 开始，逐个经过那些 1 ，跳过 cost[3] ，⼀共花费 6 。
 * 提示：
 * cost 的⻓度范围是 [2, 1000]。
 * cost[i] 将会是⼀个整型数据，范围为 [0, 999] 。
 * @Date 2021/7/25 16:05
 */
public class 使用最小花费爬楼梯746 {

    public int minCostClimbingStairs(int[] cost) {

        //1.dp[i]:到达第i个台阶所花费的最少的体力 dp[i]
        int[] dp = new int[cost.length];
        //3.初始化 : dp[0] = cost[0] dp[1] = cost[1];
        dp[0] = cost[0];
        dp[1] = cost[1];
        for (int i = 2; i < cost.length; i++) {
            //2.递推公式: dp[i] = min(dp[i - 1] , dp[i - 2]) +cost[i];
            //最后达到顶端 1:走一步 2:走两步 , 取最小值
            dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
        }
        //加上自己的消耗值
        return Math.min(dp[cost.length - 1], dp[cost.length - 2]);
    }

}
